const BillModel = require('../model/BillModel');
const fs = require('fs');
const path = require('path');
const dayjs = require('dayjs');


class BillController {
    //账单列表(分页+模糊查询)
    static async getList(req, res) {
        try {
            // 验证输入参数
            const page = parseInt(req.query.page) || 1;
            const pagesize = parseInt(req.query.pagesize) || 10;
            const accounting_month = req.query.accounting_month || '';
            const record_date = req.query.record_date || '';
            const accounting_item = req.query.accounting_item || '';
            const record_type = req.query.record_type || '';

            // 参数校验
            if (page < 1) {
                return res.status(400).json({ code: 1, msg: '页码必须大于0' });
            }
            if (pagesize < 1 || pagesize > 100) {
                return res.status(400).json({ code: 1, msg: '每页数量必须在1-100之间' });
            }

            // 调用模型方法获取账单数据
            const data = await BillModel.fetchAll({ accounting_month, record_date, accounting_item, record_type, page, pagesize });
            res.json({ code: 0, msg: 'success', data });
        } catch (e) {
            // 错误处理：记录日志并返回错误响应
            console.error('获取账单列表错误:', e.message);
            res.status(500).json({ code: 1, msg: '服务器内部错误' });
        }
    }

    // 获取账单详情
    static async getBillById(req, res) {
        try {
            const id = parseInt(req.params.id);
            if (!id) {
                return res.status(400).json({ code: 1, msg: '无效的账单ID' });
            }

            const bill = await BillModel.findById(id);
            if (!bill) {
                return res.status(404).json({ code: 1, msg: '账单不存在' });
            }

            res.json({ code: 0, msg: 'success', data: bill });
        } catch (e) {
            console.error('获取账单详情错误:', e.message);
            res.status(500).json({ code: 1, msg: '服务器内部错误' });
        }
    }
    // 添加账单
    static async addBill(req, res) {
        try {
            // 解析表单数据
            let billData = {};

            // 处理文本字段
            if (req.body.data) {
                billData = JSON.parse(req.body.data);
            } else {
                billData = req.body;
            }

            // 数据验证
            if (!billData.record_date) {
                return res.status(400).json({ code: 1, msg: '记账日期不能为空' });
            }

            console.log(billData);

            if (!billData.accounting_month) {
                return res.status(400).json({ code: 1, msg: '所属月份不能为空' });
            }

            // 确保会计月份格式正确（YYYY-MM）
            const monthRegex = /^\d{4}-\d{2}$/;
            if (!monthRegex.test(billData.accounting_month)) {
                return res.status(400).json({ code: 1, msg: '所属月份格式不正确，应为 YYYY-MM 格式' });
            }

            if (!billData.record_type || !['income', 'expense'].includes(billData.record_type)) {
                return res.status(400).json({ code: 1, msg: '记账类型必须为income或expense' });
            }

            if (!billData.accounting_item) {
                return res.status(400).json({ code: 1, msg: '收支项目不能为空' });
            }

            if (!billData.amount || isNaN(billData.amount)) {
                return res.status(400).json({ code: 1, msg: '金额必须为有效数字' });
            }

            if (!billData.handler) {
                return res.status(400).json({ code: 1, msg: '经办人不能为空' });
            }

            // 处理上传的文件 - 使用CommonController中的文件上传逻辑
            if (req.files && req.files.receipt_image_path) {
                const file = req.files.receipt_image_path;

                // 检查文件大小 (5MB限制)
                if (file.size > 5 * 1024 * 1024) {
                    return res.status(400).json({ code: 1, msg: '文件大小超过限制（最大5MB）' });
                }

                // 检查MIME类型
                const allowedImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/bmp'];
                if (!allowedImageTypes.includes(file.mimetype)) {
                    return res.status(400).json({ code: 1, msg: '只允许上传图片文件 (jpg, jpeg, png, gif, bmp)' });
                }

                // 检查文件扩展名
                const allowedImageExtensions = /\.(jpg|jpeg|png|gif|bmp)$/i;
                if (!allowedImageExtensions.test(file.name)) {
                    return res.status(400).json({ code: 1, msg: '只允许上传图片文件 (jpg, jpeg, png, gif, bmp)' });
                }

                // 生成唯一文件名以防止文件名冲突
                const timestamp = Date.now();
                const randomString = Math.random().toString(36).substring(2, 15);
                const fileExtension = path.extname(file.name);
                const uniqueFileName = `${timestamp}-${randomString}${fileExtension}`;

                // 确保上传目录存在
                const uploadDir = path.join("public", "uploads");
                if (!fs.existsSync(uploadDir)) {
                    fs.mkdirSync(uploadDir, { recursive: true });
                }

                const uploadPath = path.join(uploadDir, uniqueFileName); //存储路径
                const showPath = "static/uploads/" + uniqueFileName;

                // 记录文件上传时间
                const startTime = new Date();
                console.log(`开始上传收据文件: ${uniqueFileName} at ${startTime}`);

                // 移动文件到指定位置
                await file.mv(uploadPath);

                const endTime = new Date();
                const uploadDuration = (endTime - startTime) / 1000; // 转换为秒
                console.log(`收据文件上传成功: ${uniqueFileName}, 用时: ${uploadDuration}s, 大小: ${file.size} bytes`);

                // 保存文件路径到数据库
                billData.receipt_image_path = showPath;
            }
            const day = dayjs(billData.accounting_month).format("YYYY-MM-DD"); console.log(day);

            // billData.accounting_month = day;

            if (billData.accounting_month) {
                const monthRegex = /^\d{4}-\d{2}$/;
                if (!monthRegex.test(billData.accounting_month)) {
                    return res.status(400).json({ code: 1, msg: '所属月份格式不正确，应为 YYYY-MM 格式' });
                }
            }
            const insertId = await BillModel.create(billData);
            res.json({ code: 0, msg: '添加成功', data: { id: insertId } });
        } catch (e) {
            console.error('添加账单错误:', e.message);
            console.error('错误堆栈:', e.stack);
            res.status(500).json({ code: 1, msg: '服务器内部错误' });
        }
    }


    // 编辑账单
    static async updateBill(req, res) {
        try {
            const id = parseInt(req.params.id);
            if (!id) {
                return res.status(400).json({ code: 1, msg: '无效的账单ID' });
            }

            // 获取现有账单信息
            const existingBill = await BillModel.findById(id);
            if (!existingBill) {
                return res.status(404).json({ code: 1, msg: '账单不存在' });
            }

            // 解析表单数据
            let billData = {};

            // 处理文本字段
            if (req.body.data) {
                billData = JSON.parse(req.body.data);
            } else {
                billData = req.body;
            }

            if (billData.record_date) {
                // 使用 dayjs 转换为标准的 YYYY-MM-DD HH:mm:ss 格式
                billData.record_date = dayjs(billData.record_date).format('YYYY-MM-DD HH:mm:ss');
            }

            if (billData.accounting_month) {
                // 使用 dayjs 提取年月部分，并格式化为 YYYY-MM
                const date = dayjs(billData.accounting_month);
                billData.accounting_month = date.format('YYYY-MM-DD');
            }

            // 数据验证
            if (!billData.record_date) {
                return res.status(400).json({ code: 1, msg: '记账日期不能为空' });
            }

            if (!billData.accounting_month) {
                return res.status(400).json({ code: 1, msg: '所属月份不能为空' });
            }

            if (!billData.record_type || !['income', 'expense'].includes(billData.record_type)) {
                return res.status(400).json({ code: 1, msg: '记账类型必须为income或expense' });
            }

            if (!billData.accounting_item) {
                return res.status(400).json({ code: 1, msg: '收支项目不能为空' });
            }

            if (!billData.amount || isNaN(billData.amount)) {
                return res.status(400).json({ code: 1, msg: '金额必须为有效数字' });
            }

            if (!billData.handler) {
                return res.status(400).json({ code: 1, msg: '经办人不能为空' });
            }

            // 处理上传的文件 - 使用CommonController中的文件上传逻辑
            if (req.files && req.files.receipt_image_path) {
                const file = req.files.receipt_image_path;

                // 检查文件大小 (5MB限制)
                if (file.size > 5 * 1024 * 1024) {
                    return res.status(400).json({ code: 1, msg: '文件大小超过限制（最大5MB）' });
                }

                // 检查MIME类型
                const allowedImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/bmp'];
                if (!allowedImageTypes.includes(file.mimetype)) {
                    return res.status(400).json({ code: 1, msg: '只允许上传图片文件 (jpg, jpeg, png, gif, bmp)' });
                }

                // 检查文件扩展名
                const allowedImageExtensions = /\.(jpg|jpeg|png|gif|bmp)$/i;
                if (!allowedImageExtensions.test(file.name)) {
                    return res.status(400).json({ code: 1, msg: '只允许上传图片文件 (jpg, jpeg, png, gif, bmp)' });
                }

                // 如果存在旧文件，删除旧文件
                if (existingBill.receipt_image_path) {
                    const oldFilePath = path.join("public", existingBill.receipt_image_path.replace("static/", ""));
                    if (fs.existsSync(oldFilePath)) {
                        fs.unlinkSync(oldFilePath);
                        console.log(`已删除旧收据文件: ${oldFilePath}`);
                    }
                }

                // 生成唯一文件名以防止文件名冲突
                const timestamp = Date.now();
                const randomString = Math.random().toString(36).substring(2, 15);
                const fileExtension = path.extname(file.name);
                const uniqueFileName = `${timestamp}-${randomString}${fileExtension}`;

                // 确保上传目录存在
                const uploadDir = path.join("public", "uploads");
                if (!fs.existsSync(uploadDir)) {
                    fs.mkdirSync(uploadDir, { recursive: true });
                }

                const uploadPath = path.join(uploadDir, uniqueFileName); //存储路径
                const showPath = "static/uploads/" + uniqueFileName;

                // 记录文件上传时间
                const startTime = new Date();
                console.log(`开始上传收据文件: ${uniqueFileName} at ${startTime}`);

                // 移动文件到指定位置
                await file.mv(uploadPath);

                const endTime = new Date();
                const uploadDuration = (endTime - startTime) / 1000; // 转换为秒
                console.log(`收据文件上传成功: ${uniqueFileName}, 用时: ${uploadDuration}s, 大小: ${file.size} bytes`);

                // 保存文件路径到数据库
                billData.receipt_image_path = showPath;
            }

            if (billData.record_date) {
                billData.record_date = dayjs(billData.record_date).format('YYYY-MM-DD HH:mm:ss');
            }


            const result = await BillModel.update(id, billData);
            if (!result) {
                return res.status(404).json({ code: 1, msg: '账单不存在' });
            }

            res.json({ code: 0, msg: '更新成功' });
        } catch (e) {
            console.error('更新账单错误:', e.message);
            console.error('错误堆栈:', e.stack);
            res.status(500).json({ code: 1, msg: '服务器内部错误' });
        }
    }
}

module.exports = BillController;